package day02;

import java.math.BigDecimal;

//此类是用于验证double数据类型的测试demo
public class DoubleDemo {
    public static void main(String[] args) {
        /*
        double类型：双精度浮点数，占用8个字节，基本上可以存储很大的数字了
        double类型的特点：
        小数直接量默认为double型，可以加上D，如果想要表示float类型，需要在数字后边加上F或者f
        double和float类型存在舍入误差，如果追求精度就不要使用double和float了
         */
        /**在计算机中，double 类型的浮点数表示方式有其固有的精度限制。由于计算机存储浮点数时采用二进制表示，
         *并且有限的位数用来表示小数部分，因此可能会导致某些小数无法精确地表示。这种问题通常称为浮点数精度问题。
         *它可能导致某些小数的计算结果在我们的预期之外，出现舍入误差。舍入误差可能受到数学运算顺序、机器架构、
         *编程语言实现等多种因素的影响。举例来说，像 0.1 这样的简单十进制小数在二进制中是一个无限循环小数，
         *因此无法被精确地表示。这就是为什么在某些情况下，double 运算可能会产生预期之外的结果。
         *为了避免这种情况，
         *特别是在涉及货币或其他需要高精度计算的场景中，可以考虑使用 BigDecimal 类型来进行精确计算，
         *因为它可以提供更高的精度并减少舍入误差的影响
         */
        double a = 3.14;        //定义double类型变量a，值为3.14
        double b = 6.28;        //定义double类型变量b，值为6.28
        double c = 6.0;         //定义double类型变量c，值为6.0
        double d = 5.9;         //定义double类型变量d，值为5.9
        System.out.println(c - d);  //0.09999999999999964
        double  e = 6.0;
        double  f = 1.9;
        System.out.println(e - f);  //4.1

        //补充：
        //如果追求精度，那么可以使用BigDecimal进行处理
        //不是本节课重点，后边学了面向对象会豁然开朗
        BigDecimal x = new BigDecimal("6.0");
        BigDecimal y = new BigDecimal("5.9");
        BigDecimal result = x.subtract(y);
        System.out.println(result); //0.1
    }
}
